'''
Created on Aug 3, 2019

@author: yc
'''
#类School继承object（在python3中，即使不写括号里的内容，也会默认继承object）
from builtins import staticmethod
from test.inspect_fodder2 import cls135
class School(object):
    '''
    测试类School
    '''
    
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def student(self):
        print ('name: %s, age: %s'%(self.name, self.age))
    def classroom(self):
        print("%s去教室" %self.name)

#类SchoolA 继承 School，可以使用School中的classroom方法
class SchoolA(School):
    def __init__(self, name):
        self.name = name

#类School 继承 SchoolA，可以使用SchoolA中的classroom方法
class SchoolB(SchoolA):
    def __init__(self, name):
        self.name = name

class SchoolC(School):
    boos = "王老板"
    def __init__(self, name):
        self.name = name

class School2:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def student(self):
        print("普通方法")
    
    @staticmethod
    def classroom():
        print("静态方法")
    
    @classmethod
    def dormitory(cls):
        print("类方法", cls)
    
    #装饰器定义1:不传参数
    @property
    def shuxing(self):
        print("属性")
    
    #装饰器定义2:传参数: 还不能名为其他名称
    @shuxing.setter
    def shuxing(self, age):
        self.age = age
        print("修改",self.name,self.age)
    
    #装饰器定义3:
    @shuxing.deleter
    def shuxing(self, age):
        del self.age
        print("删除",self.name,self.age)

class School3:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def shuxing(self):
        print("属性")
    
    def shuxing_update(self, age):
        self.age = age
        print("修改",self.name,self.age)
    
    def shuxing_delete(self, age):
        del self.age
        print("删除",self.name,self.age)
    
    #School2的替代写法：静态属性（不用注解）
    obj = property(shuxing, shuxing_update, shuxing_delete)

class School4:
    '''
    School4的注释内容
    '''
    dog = "狗"
    __cat = "猫"
    
    def __init__(self, name, age):
        self.name = name
        self.__age = age
    
    def getAge(self):
        print(self.__age)
    
    def getCat(self):
        print(School4.__cat)
    
    def __getDog(self):
        print(School4.dog)
    
    def getDog(self):
        self.__getDog()


#------------------------测试方法-------------------------------------------#
# 创建对象
a1 = School("zhangsan", 12)
a2 = School("lisi", 13)

#直接访问成员
print("--------访问成员变量-----")
print(a1.name,a1.age)
print(a2.name,a2.age)

#访问成员方法
print("--------访问成员方法-----")
a1.student()
a2.student()

# 继承
print("----------继承------------")
a3 = SchoolA("zhangsan")
a4 = SchoolB("lisi")

a3.classroom()
a4.classroom()

#python支持多继承，调用多函数遍历方式为广度优先（python2由于不是默认继承object，则分广度和深度两种情况）

# 多态： python是一种多态语言，所以用不到多态概念

# 类包括：字段（普通字段/静态字段），方法，属性
# 1.字段
# 以类SchoolC为例：
# 普通字段： __init__中多name是。 只能通过对象访问。
# 静态字段： boos。 直接通过类访问，只有一份

# 方法： 普通方法/静态方法/类方法
print("-------方法--------")
a5 = School2("aa", 12)
a5.student()
a5.classroom()
a5.dormitory()

'''返回结果：
    普通方法
    静态方法
    类方法 <class '__main__.School2'>

类方法：直接用类调用，只能一个cls参数
　　　　上面我们可以看到执行类方法时，输出了他传入的参数等于<class '__main__.School'>，
是一个类，意思就是执行时，它会把当前的类当成参数传进去。
'''

print("---------属性--------------")
#属性和普通方法的区别就是调用的时候没有括号（没有参数列表：不传参数）
# a5.shuxing
#调用方式注意
# a5.shuxing = 20
#调用删除属性方法
# del a5.shuxing
print("静态字段定义属性---")

a6 = School3("aa", 12)
#等效于a5.shuxing
a6.obj
#等效于a5.shuxing = 20
a6.obj = 20
#等效于del a5.shuxing
# del a6.obj

print("----------共有成员/私有成员/共有方法/私有方法------------------")
a7 = School4("zhangsan", 12)
print("共有静态字段: ",a7.dog)#访问共有静态字段，可以
# print("私有静态字段: ",a7.__cat)#访问私有静态字段，不可以
print("共有普通字段: ",a7.name)#访问共有普通字段，可以
# print("私有普通字段: ",a7.__age)#访问私有普通字段，不可以
# print("参数列表字段：",a7.age)#这个什么都不是

a7.getAge()
a7.getCat()
# a7.__getDog()
a7.getDog()

print("--------类中都特殊方法------")
print(School4.__doc__)



